﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;


namespace Sinacor.Tools.Negocio
{
    public class Permissoes
    {

        protected const string XPATH_PAGINA = "/objetos/paginas/pagina[@nome='{0}']";
        protected const string XPATH_USUARIO = "/usuarios/usuario[@id='{0}']";
        protected const string XPATH_OBJETO = "/objetos/objeto/{0}";
        protected const string XPATH_OPERACAO = "/{0}";
        

        public static bool usuarioPossuiPermissaoPagina(string nomePagina, string idUsuario, string caminhoXml)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(caminhoXml);

            XmlNode no = doc.SelectSingleNode(string.Format(XPATH_PAGINA, nomePagina));
            if (no == null) throw new Exception("A Página [" + nomePagina.ToLower() + "] não está cadastrada!");

            if (no.Attributes["validar"] != null && no.Attributes["validar"].InnerText.ToLower() == "false") return true;

            XmlNode permitido = doc.SelectSingleNode(string.Format(XPATH_PAGINA, nomePagina) + string.Format(XPATH_USUARIO, idUsuario.ToLower()));
            return permitido != null;            
        }

        public static bool usuarioPossuiPermissaoRecurso(string nomeObjeto, string nomeOperacao, string idUsuario, string caminhoXml)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(caminhoXml);

            XmlNode no = doc.SelectSingleNode(string.Format(XPATH_OBJETO, nomeObjeto));
            if (no == null) throw new Exception("A Página [" + nomeObjeto.ToLower() + "] não está cadastrada!");

            XmlNode noOperacao = doc.SelectSingleNode(string.Format(XPATH_OBJETO, nomeObjeto) + string.Format(XPATH_OPERACAO, nomeOperacao));
            if (noOperacao == null) throw new Exception("A operação " + nomeOperacao + " não está cadastrada para o objeto " + nomeObjeto);

            XmlNode permitido = no.SelectSingleNode(string.Format("{0}{1}{2}", string.Format(XPATH_OBJETO, nomeObjeto), string.Format(XPATH_OPERACAO, nomeOperacao), string.Format(XPATH_USUARIO, idUsuario.ToLower())));
            return permitido != null;
        }
    }
}
